/*
 * LinkedList.h
 *
 *  Created on: 2015年6月13日
 *      Author: vincent
 */

#ifndef LINKEDLIST_H_
#define LINKEDLIST_H_

/**
 *  链表中的元素结构
 */
typedef struct _linked_list_element
{
	void* target;
	struct _linked_list_element* previous;
	struct _linked_list_element* next;
}LINKED_LIST_ELEMENT;

/**
 * 链表结构
 */
typedef struct _linked_list
{
	LINKED_LIST_ELEMENT* first;
	LINKED_LIST_ELEMENT* last;
	unsigned int length;
}LINKED_LIST;

#define LINKED_LIST_ITERATOR_TYPE_FIRST 0
#define LINKED_LIST_ITERATOR_TYPE_LAST 1

typedef struct _linked_list_iterator
{
	LINKED_LIST* linked_list;
	unsigned char iterator_type;
	LINKED_LIST_ELEMENT* element;
}LINKED_LIST_ITERATOR;

/**
 * 构造链表
 */
LINKED_LIST* linked_list_construct();
/**
 * 释放链表
 */
int linked_list_destroy(LINKED_LIST* linked_list);
/**
 * 在链表前添加元素
 */
void linked_list_offer_first(LINKED_LIST* linked_list, void* target);
/**
 * 在链表后添加元素
 */
void linked_list_offer_last(LINKED_LIST* linked_list, void* target);
/**
 * 获得链表第一个元素
 */
int linked_list_peek_first(const LINKED_LIST* linked_list, void** target);
/**
 * 获得链表最后一个元素
 */
int linked_list_peek_last(const LINKED_LIST* linked_list, void** target);
/**
 * 获得链表第一个元素，并移除之
 */
int linked_list_poll_first(LINKED_LIST* linked_list, void** target);
/**
 * 获得链表最后一个元素，并移除之
 */
int linked_list_poll_last(LINKED_LIST* linked_list, void** target);
/**
 * 移除链表第一个元素
 */
int linked_list_remove_first(LINKED_LIST* linked_list);
/**
 * 移除链表最后一个元素
 */
int linked_list_remove_last(LINKED_LIST* linked_list);
/**
 * 在链表前添加元素
 */
void linked_list_offer_first(LINKED_LIST* linked_list, void* target);
/**
 * 在链表后添加元素
 */
void linked_list_offer_last(LINKED_LIST* linked_list, void* target);
/**
 * 获得链表第一个元素
 */
int linked_list_peek_first(const LINKED_LIST* linked_list, void** target);
/**
 * 获得链表最后一个元素
 */
int linked_list_peek_last(const LINKED_LIST* linked_list, void** target);
/**
 * 获得链表第一个元素，并移除之
 */
int linked_list_poll_first(LINKED_LIST* linked_list, void** target);
/**
 * 获得链表最后一个元素，并移除之
 */
int linked_list_poll_last(LINKED_LIST* linked_list, void** target);
/**
 * 移除链表第一个元素
 */
int linked_list_remove_first(LINKED_LIST* linked_list);
/**
 * 移除链表最后一个元素
 */
int linked_list_remove_last(LINKED_LIST* linked_list);
/**
 * 构造链表迭代器
 */
LINKED_LIST_ITERATOR* linked_list_iterator_construct(LINKED_LIST* linked_list,
		unsigned char iterator_type);
/**
 * 释放链表迭代器
 */
int linked_list_iterator_destroy(LINKED_LIST_ITERATOR* linked_list_iterator);
/**
 * 检查是否有下一个元素
 */
int linked_list_iterator_has_next(LINKED_LIST_ITERATOR* linked_list_iterator);
/**
 * 得到当前迭代器的值并指向下一个元素
 */
int linked_list_iterator_next(LINKED_LIST_ITERATOR* linked_list_iterator,	void** target);
/**
 * 获得链表中指定位置的元素
 */
int linked_list_get(LINKED_LIST* linked_list,
		unsigned int index, void** target, unsigned char iterator_type);
/**
 * 设置链表中指定位置的元素
 */
int linked_list_set(LINKED_LIST* linked_list,
		unsigned int index, void* target, unsigned char iterator_type);
/**
 * 在链表中指定位置前插入元素
 */
int linked_list_insert(LINKED_LIST* linked_list,
		unsigned int index, void* target, unsigned char iterator_type);
/**
 * 删除链表中指定位置的元素
 */
int linked_list_remove(LINKED_LIST* linked_list,
		unsigned int index, void** target, unsigned char iterator_type);

#endif /* LINKEDLIST_H_ */
